gtk_widget_set_margin_bottom (box, 10);
gtk_window_set_child (GTK_WINDOW (window), box);
- button = gtk_drop_down_new ();
+ button = gtk_drop_down_new (NULL, NULL);
model = G_LIST_MODEL (pango_cairo_font_map_get_default ());
gtk_drop_down_set_model (GTK_DROP_DOWN (button), model);
g_signal_connect (selection, "items-changed", G_CALLBACK (items_changed_cb), label);
gtk_header_bar_pack_start (GTK_HEADER_BAR (header), label);
- dropdown = gtk_drop_down_new ();
- gtk_drop_down_set_from_strings (GTK_DROP_DOWN (dropdown), (const char *[]) { "8", "64", "512", "4096", "32768", "262144", "2097152", "16777216", NULL });
+ dropdown = gtk_drop_down_new_from_strings ((const char * const[]) { "8", "64", "512", "4096", "32768", "262144", "2097152", "16777216", NULL });
g_signal_connect (dropdown, "notify::selected",
G_CALLBACK (limit_changed_cb),
gtk_sort_list_model_get_model (sort_model));
g_list_store_append (sorters, multi_sorter);
g_object_unref (multi_sorter);
- dropdown = gtk_drop_down_new ();
+ dropdown = gtk_drop_down_new (G_LIST_MODEL (sorters), NULL);
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
gtk_box_append (GTK_BOX (box), gtk_label_new ("Sort by:"));
gtk_box_append (GTK_BOX (box), dropdown);
gtk_drop_down_set_expression (GTK_DROP_DOWN (dropdown), expression);
gtk_expression_unref (expression);
- gtk_drop_down_set_model (GTK_DROP_DOWN (dropdown), G_LIST_MODEL (sorters));
- g_object_unref (sorters);
-
g_object_bind_property (dropdown, "selected-item", sort_model, "sorter", G_BINDING_SYNC_CREATE);
factories = g_list_store_new (GTK_TYPE_LIST_ITEM_FACTORY);
set_title (factory, "Everything");
g_list_store_append (factories, factory);
- dropdown = gtk_drop_down_new ();
+ dropdown = gtk_drop_down_new (G_LIST_MODEL (factories), NULL);
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10);
gtk_box_append (GTK_BOX (box), gtk_label_new ("Show:"));
gtk_box_append (GTK_BOX (box), dropdown);
gtk_drop_down_set_expression (GTK_DROP_DOWN (dropdown), expression);
gtk_expression_unref (expression);
- gtk_drop_down_set_model (GTK_DROP_DOWN (dropdown), G_LIST_MODEL (factories));
- g_object_unref (factories);
-
g_object_bind_property (dropdown, "selected-item", gridview, "factory", G_BINDING_SYNC_CREATE);
}
<TITLE>GtkDropDown</TITLE>
GtkDropDown
gtk_drop_down_new
-gtk_drop_down_set_from_strings
+gtk_drop_down_new_from_strings
gtk_drop_down_set_model
gtk_drop_down_get_model
gtk_drop_down_set_selected
gtk_grid_attach (GTK_GRID (grid), hbox, 0, 4, 2, 1);
gtk_widget_show (hbox);
- combo = gtk_drop_down_new ();
- gtk_drop_down_set_model (GTK_DROP_DOWN (combo), dialog->printer_list);
+ combo = gtk_drop_down_new (g_object_ref (dialog->printer_list), NULL);
factory = gtk_signal_list_item_factory_new ();
g_signal_connect (factory, "setup", G_CALLBACK (setup_printer_item), dialog);
* and expects to obtain these from the model by evaluating an expression
* that has to be provided via gtk_drop_down_set_expression().
*
- * The convenience method gtk_drop_down_set_from_strings() can be used
- * to set up a model that is populated from an array of strings and
- * an expression for obtaining those strings.
+ * GtkDropDown knows how to obtain strings from the items in a
+ * #GtkStringList; for other models, you have to provide an expression
+ * to find the strings.
*
* GtkDropDown can optionally allow search in the popup, which is
* useful if the list of options is long. To enable the search entry,
/**
* gtk_drop_down_new:
+ * @model: (transfer full) (allow-none): the model to use or %NULL for none
+ * @expression: (transfer full) (allow-none): the expression to use or %NULL for none
*
- * Creates a new empty #GtkDropDown.
+ * Creates a new #GtkDropDown.
*
- * You most likely want to call gtk_drop_down_set_factory() to
- * set up a way to map its items to widgets and gtk_drop_down_set_model()
- * to set a model to provide items next.
+ * You may want to call gtk_drop_down_set_factory()
+ * to set up a way to map its items to widgets.
*
* Returns: a new #GtkDropDown
**/
GtkWidget *
-gtk_drop_down_new (void)
+gtk_drop_down_new (GListModel *model,
+ GtkExpression *expression)
{
- return g_object_new (GTK_TYPE_DROP_DOWN, NULL);
+ GtkWidget *self;
+
+ self = g_object_new (GTK_TYPE_DROP_DOWN,
+ "model", model,
+ "expression", expression,
+ NULL);
+
+ /* we're consuming the references */
+ g_clear_object (&model);
+ g_clear_pointer (&expression, gtk_expression_unref);
+
+ return self;
+}
+
+/**
+ * gtk_drop_down_new_from_strings:
+ * @strings: (array zero-terminated=1): The strings to put in the dropdown
+ *
+ * Creates a new #GtkDropDown that is populated with
+ * the strings in @strings.
+ *
+ * Returns: a new #GtkDropDown
+ */
+GtkWidget *
+gtk_drop_down_new_from_strings (const char * const *strings)
+{
+ return gtk_drop_down_new (G_LIST_MODEL (gtk_string_list_new (strings)), NULL);
}
/**
return self->expression;
}
-
-/**
- * gtk_drop_down_set_from_strings:
- * @self: a #GtkDropDown
- * @texts: (array zero-terminated=1) (element-type utf8): a %NULL-terminated string array
- *
- * Populates @self with the strings in @text,
- * by creating a suitable model and factory.
- */
-void
-gtk_drop_down_set_from_strings (GtkDropDown *self,
- const char *const *texts)
-{
- GListModel *model;
-
- g_return_if_fail (GTK_IS_DROP_DOWN (self));
- g_return_if_fail (texts != NULL);
-
- set_default_factory (self);
-
- model = G_LIST_MODEL (gtk_string_list_new (texts));
- gtk_drop_down_set_model (self, model);
- g_object_unref (model);
-}
G_DECLARE_FINAL_TYPE (GtkDropDown, gtk_drop_down, GTK, DROP_DOWN, GtkWidget)
GDK_AVAILABLE_IN_ALL
-GtkWidget * gtk_drop_down_new (void);
+GtkWidget * gtk_drop_down_new (GListModel *model,
+ GtkExpression *expression);
GDK_AVAILABLE_IN_ALL
-void gtk_drop_down_set_from_strings (GtkDropDown *self,
- const char *const *texts);
+GtkWidget * gtk_drop_down_new_from_strings (const char * const * strings);
GDK_AVAILABLE_IN_ALL
void gtk_drop_down_set_model (GtkDropDown *self,
{
GtkWidget *box;
GtkWidget *combo;
- GListModel *model;
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
gtk_box_append (GTK_BOX (box), gtk_label_new (label));
- combo = gtk_drop_down_new ();
+ combo = gtk_drop_down_new_from_strings ((const char * const *)options);
g_hash_table_insert (impl->choices, g_strdup (id), combo);
gtk_box_append (GTK_BOX (box), combo);
- model = G_LIST_MODEL (gtk_string_list_new ((const char * const *)options));
- gtk_drop_down_set_model (GTK_DROP_DOWN (combo), model);
- g_object_unref (model);
-
widget = box;
}
else
#include "gtktogglebutton.h"
#include "gtkorientable.h"
#include "gtkprivate.h"
+#include "gtkstringlist.h"
#include "gtkprinteroptionwidget.h"
gtk_widget_add_css_class (hbox, "linked");
entry = gtk_entry_new ();
- button = gtk_drop_down_new ();
+ button = gtk_drop_down_new (NULL, NULL);
combo_box_set_model (button);
factory = gtk_signal_list_item_factory_new ();
{
GtkWidget *combo_box;
- combo_box = gtk_drop_down_new ();
+ combo_box = gtk_drop_down_new (NULL, NULL);
combo_box_set_model (combo_box);
combo_box_set_view (combo_box);
const char * strings[2];
strings[0] = _("Not available");
strings[1] = NULL;
- priv->combo = gtk_drop_down_new ();
- gtk_drop_down_set_from_strings (GTK_DROP_DOWN (priv->combo), strings);
+ priv->combo = gtk_drop_down_new_from_strings (strings);
gtk_drop_down_set_selected (GTK_DROP_DOWN (priv->combo), 0);
gtk_widget_set_sensitive (GTK_WIDGET (widget), FALSE);
gtk_widget_show (priv->combo);
phases[3] = C_("event phase", "Target");
phases[4] = NULL;
- dropdown = gtk_drop_down_new ();
- gtk_drop_down_set_from_strings (GTK_DROP_DOWN (dropdown), phases);
+ dropdown = gtk_drop_down_new_from_strings (phases);
gtk_drop_down_set_selected (GTK_DROP_DOWN (dropdown), gtk_event_controller_get_propagation_phase (controller));
gtk_box_append (GTK_BOX (box), dropdown);
gtk_widget_set_halign (label, GTK_ALIGN_END);
{
{
GEnumClass *eclass;
- char **names;
+ GtkStringList *names;
int j;
eclass = G_ENUM_CLASS (g_type_class_ref (spec->value_type));
- names = g_new (char *, eclass->n_values + 1);
+ names = gtk_string_list_new (NULL);
for (j = 0; j < eclass->n_values; j++)
- names[j] = (char *)eclass->values[j].value_name;
- names[eclass->n_values] = NULL;
+ gtk_string_list_append (names, eclass->values[j].value_name);
- prop_edit = gtk_drop_down_new ();
- gtk_drop_down_set_from_strings (GTK_DROP_DOWN (prop_edit), (const char **)names);
-
- g_free (names);
+ prop_edit = gtk_drop_down_new (G_LIST_MODEL (names), NULL);
connect_controller (G_OBJECT (prop_edit), "notify::selected",
object, spec, G_CALLBACK (enum_modified));
gtk_box_append (GTK_BOX (box), button);
gtk_box_append (GTK_BOX (box), gtk_label_new (_("Column:")));
- dropdown = gtk_drop_down_new ();
+ dropdown = gtk_drop_down_new (NULL, NULL);
store = g_list_store_new (ATTRIBUTE_TYPE_HOLDER);
holder = attribute_holder_new (-1, TRUE);
#include "gtkswitch.h"
#include "gtkwidgetprivate.h"
#include "gtkstack.h"
+#include "gtkstringlist.h"
typedef struct {
gtk_widget_set_valign (label, GTK_ALIGN_BASELINE);
gtk_box_append (GTK_BOX (box2), label);
- dropdown = gtk_drop_down_new ();
- gtk_drop_down_set_from_strings (GTK_DROP_DOWN (dropdown), modes);
+ dropdown = gtk_drop_down_new_from_strings (modes);
g_object_set (dropdown, "margin", 10, NULL);
gtk_widget_set_halign (dropdown, GTK_ALIGN_END);
gtk_widget_set_valign (dropdown, GTK_ALIGN_BASELINE);
#include "gtkbinlayout.h"
#include "gtkeditable.h"
#include "gtkentry.h"
+#include "gtkstringlist.h"
#ifdef GDK_WINDOWING_X11
#include "x11/gdkx.h"
GValue *to,
gpointer user_data)
{
- char **names = user_data;
+ GtkStringList *names = user_data;
const char *theme = g_value_get_string (from);
- int i;
+ guint i, n;
- for (i = 0; names[i]; i++)
+ for (i = 0, n = g_list_model_get_n_items (G_LIST_MODEL (names)); i < n; i++)
{
- if (strcmp (names[i], theme) == 0)
+ const char *name = gtk_string_list_get_string (names, i);
+ if (strcmp (name, theme) == 0)
{
g_value_set_uint (to, i);
return TRUE;
GValue *to,
gpointer user_data)
{
- char **names = user_data;
+ GtkStringList *names = user_data;
int pos = g_value_get_uint (from);
- g_value_set_string (to, names[pos]);
+ g_value_set_string (to, gtk_string_list_get_string (names, pos));
return TRUE;
}
char *theme, *path;
char **builtin_themes;
GList *list, *l;
+ GtkStringList *names;
guint i;
const char * const *dirs;
- char **names;
t = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
/* Builtin themes */
while (g_hash_table_iter_next (&iter, (gpointer *)&theme, NULL))
list = g_list_insert_sorted (list, theme, (GCompareFunc)strcmp);
- names = g_new (char *, g_list_length (list) + 1);
+ names = gtk_string_list_new (NULL);
for (l = list, i = 0; l; l = l->next, i++)
- names[i] = g_strdup (l->data);
- names[i] = NULL;
+ gtk_string_list_append (names, (const char *)l->data);
g_list_free (list);
g_hash_table_destroy (t);
- gtk_drop_down_set_from_strings (GTK_DROP_DOWN (vis->theme_combo), (const char **)names);
+ gtk_drop_down_set_model (GTK_DROP_DOWN (vis->theme_combo), G_LIST_MODEL (names));
g_object_bind_property_full (gtk_settings_get_for_display (vis->display), "gtk-theme-name",
vis->theme_combo, "selected",
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE,
- theme_to_pos, pos_to_theme, names, (GDestroyNotify)g_strfreev);
+ theme_to_pos, pos_to_theme, names, (GDestroyNotify)g_object_unref);
if (g_getenv ("GTK_THEME") != NULL)
{
GHashTableIter iter;
char *theme, *path;
GList *list, *l;
- char **names;
int i;
+ GtkStringList *names;
t = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
while (g_hash_table_iter_next (&iter, (gpointer *)&theme, NULL))
list = g_list_insert_sorted (list, theme, (GCompareFunc)strcmp);
- names = g_new (char *, g_list_length (list) + 1);
+ names = gtk_string_list_new (NULL);
for (l = list, i = 0; l; l = l->next, i++)
- names[i] = g_strdup (l->data);
- names[i] = NULL;
+ gtk_string_list_append (names, (const char *)l->data);
g_hash_table_destroy (t);
g_list_free (list);
- gtk_drop_down_set_from_strings (GTK_DROP_DOWN (vis->icon_combo), (const char **)names);
+ gtk_drop_down_set_model (GTK_DROP_DOWN (vis->icon_combo), G_LIST_MODEL (names));
g_object_bind_property_full (gtk_settings_get_for_display (vis->display), "gtk-icon-theme-name",
vis->icon_combo, "selected",
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE,
- theme_to_pos, pos_to_theme, names, (GDestroyNotify)g_strfreev);
+ theme_to_pos, pos_to_theme, names, (GDestroyNotify)g_object_unref);
}
static void
GHashTableIter iter;
char *theme, *path;
GList *list, *l;
- char **names;
+ GtkStringList *names;
int i;
t = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
while (g_hash_table_iter_next (&iter, (gpointer *)&theme, NULL))
list = g_list_insert_sorted (list, theme, (GCompareFunc)strcmp);
- names = g_new (char *, g_list_length (list) + 1);
+ names = gtk_string_list_new (NULL);
for (l = list, i = 0; l; l = l->next, i++)
- names[i] = g_strdup (l->data);
- names[i] = NULL;
+ gtk_string_list_append (names, (const char *)l->data);
g_hash_table_destroy (t);
g_list_free (list);
- gtk_drop_down_set_from_strings (GTK_DROP_DOWN (vis->cursor_combo), (const char **)names);
+ gtk_drop_down_set_model (GTK_DROP_DOWN (vis->cursor_combo), G_LIST_MODEL (names));
g_object_bind_property_full (gtk_settings_get_for_display (vis->display), "gtk-cursor-theme-name",
vis->cursor_combo, "selected",
G_BINDING_BIDIRECTIONAL | G_BINDING_SYNC_CREATE,
- theme_to_pos, pos_to_theme, names, (GDestroyNotify)g_strfreev);
+ theme_to_pos, pos_to_theme, names, (GDestroyNotify)g_object_unref);
}
static void
gtk_widget_set_margin_bottom (box, 10);
gtk_window_set_child (GTK_WINDOW (window), box);
- button = gtk_drop_down_new ();
+ button = gtk_drop_down_new (NULL, NULL);
model = G_LIST_MODEL (pango_cairo_font_map_get_default ());
gtk_drop_down_set_model (GTK_DROP_DOWN (button), model);
button = drop_down_new_from_strings (device_titles, device_icons, device_descriptions);
gtk_box_append (GTK_BOX (box), button);
- button = gtk_drop_down_new ();
+ button = gtk_drop_down_new (NULL, NULL);
store = g_list_store_new (GTK_TYPE_STRING_PAIR);
g_list_store_append (store, gtk_string_pair_new ("1", "One"));
gtk_widget_add_css_class (hbox, "linked");
entry = gtk_entry_new ();
- button = gtk_drop_down_new ();
+ button = gtk_drop_down_new (NULL, NULL);
gtk_drop_down_set_model (GTK_DROP_DOWN (button), G_LIST_MODEL (store));